// Package main 演示GORM的多对多关联关系操作
// 本示例详细展示了如何在GORM中定义、创建、查询和更新具有多对多关联关系的数据
// 具体演示了ArticleModel（文章）和TagModel（标签）之间的多对多关联操作的完整流程
// 多对多关系是通过中间表article_tags来维护的
package main

import (
	"gin-gorm/global" // 全局数据库连接配置
	"gin-gorm/models"  // 数据模型定义包，包含ArticleModel和TagModel
)

// ManyToMany 演示GORM的多对多关联关系操作
// 该函数包含多种多对多关联操作的示例：
// 1. 创建主表记录并级联创建多个关联表记录
// 2. 创建主表记录并关联已有关联表记录
// 3. 查询主表记录并预加载关联表记录
// 4. 更新主表记录的关联表记录
func ManyToMany() {
	// ======================================
	// 1. 创建文章并新增标签（级联创建）
	// ======================================
	// 创建ArticleModel记录并同时创建新的TagModel记录
	// 这种方式会同时创建ArticleModel、TagModel以及它们之间的关联记录
	// GORM会自动处理中间表的插入操作
	// err := global.DB.Create(&models.ArticleModel{
	// 	Title: "文章1",
	// 	TagList: []models.TagModel{
	// 		{Title: "go"},   // 创建新的标签记录"go"
	// 		{Title: "python"}, // 创建新的标签记录"python"
	// 	},
	// }).Error
	// fmt.Println(err)

	// ======================================
	// 2. 创建文章并选择已有标签
	// ======================================
	// 创建ArticleModel记录并关联已存在的TagModel记录
	// 这种方式先查询已有标签，然后将其关联到新创建的文章
	// var tagIDList = []int{2} // 假设ID为2的标签已存在
	// var tagList []models.TagModel // 用于存储查询到的标签列表
	// global.DB.Find(&tagList, "id in ?", tagIDList) // 查询指定ID的标签记录

	// err := global.DB.Create(&models.ArticleModel{
	// 	Title:   "文章2",
	// 	TagList: tagList, // 关联已存在的标签
	// }).Error
	// fmt.Println(err)

	// ======================================
	// 3. 查询文章并预加载关联标签
	// ======================================
	// 查询ArticleModel记录并同时加载其关联的TagModel记录
	// Preload方法用于预先加载关联数据，避免N+1查询问题
	// var articleList []models.ArticleModel // 用于存储查询到的文章列表
	// global.DB.Preload("TagList").Find(&articleList) // 预加载TagList关联
	// fmt.Println(articleList) // 输出查询结果，包含文章及其关联的标签

	// ======================================
	// 4. 更新文章的关联标签
	// ======================================
	// 完全替换文章的所有关联标签
	// Replace方法会先清除原有关联，然后建立新的关联关系
	var article models.ArticleModel // 用于存储要更新的文章
	global.DB.Take(&article, 2) // 查询ID为2的文章记录

	// 使用Replace方法更新关联的标签列表
	// 这种方式会替换文章2的所有标签为ID为1和2的标签
	global.DB.Model(&article).Association("TagList").Replace([]models.TagModel{
		{ID: 1}, // 关联ID为1的标签
		{ID: 2}, // 关联ID为2的标签
	})

}

// main 程序入口函数
// 负责初始化数据库连接并调用ManyToMany函数进行多对多关联操作演示
// 这是一个标准的GORM应用程序入口结构
func main() {
	// 初始化数据库连接
	// Connect函数会根据配置建立与MySQL数据库的连接
	global.Connect()
	
	// 可选：如果需要执行数据库迁移操作，可以取消下一行注释
	// global.Migrate() // 执行数据库迁移，创建或更新表结构
	
	// 调用ManyToMany函数执行多对多关联操作演示
	// 该函数包含了多对多关联的完整操作示例
	ManyToMany()
}
